disponibile dalla versione 1.0
L' Ambiente Assembly è il nuovo ambiente di lavoro integrato di FreeCAD per la creazione di assiemi. Utilizza il risolutore open source Ondsel.
Questo esempio è provvisorio e potrebbe essere rimosso non appena saranno disponibili descrizioni/tutorial adeguati.
L'assieme da creare è composto da quattro parti: una Base, un'Asta Cursore, una Manovella e una Biella. Sono collegati con quattro giunti.
Parti assemblate: Base (ambra), Asta di scorrimento (azzurro chiaro), Manovella (rosso), Biella (verde)
In questo esempio tutte le parti e l'assieme vengono creati in un unico documento.
Le geometrie cilindriche degli oggetti sono parallele o perpendicolari, il resto delle forme non è rilevante per questo esempio a meno che non vi siano interferenze. Con questo presente si possono modellare gli oggetti o crearli con il codice Python seguente. Il codice creerà un nuovo documento con i quattro oggetti (più semplice rispetto alle immagini). Basta copiare e incollare le seguenti righe nella Console Python:
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
box1 = Part.makeBox(140, 40, 7, App.Vector(0, -20, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(120, 0, 7))
box2 = Part.makeBox(20, 12, 10, App.Vector(5, -6, 7))
cyl2 = Part.makeCylinder(6, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(4, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
shape = box1.fuse([cyl1, box2, cyl2]).removeSplitter().cut(cyl3)
base = doc.addObject("Part::Feature", "Base")
base.Shape = shape
box1 = Part.makeBox(4, 12, 12, App.Vector(-12, -6, 0))
box2 = Part.makeBox(14, 12, 4, App.Vector(-8, -6, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(0, 0, 4))
cyl2 = Part.makeCylinder(4, 88, App.Vector(-12, 0, 6),App.Vector(-1, 0, 0))
shape = box1.fuse([box2, cyl1, cyl2]).removeSplitter()
slider_rod = doc.addObject("Part::Feature", "SliderRod")
slider_rod.Shape = shape
slider_rod.Placement.Base = App.Vector(100, -40, 0)
cyl1 = Part.makeCylinder(7.5, 4)
box1 = Part.makeBox(15, 30, 4, App.Vector(-7.5, 0, 0))
cyl2 = Part.makeCylinder(7.5, 4, App.Vector(0, 30, 0))
cyl3 = Part.makeCylinder(4, 6, App.Vector(0, 30, 4))
cyl4 = Part.makeCylinder(4, 4)
shape = cyl1.fuse([box1, cyl2]).removeSplitter().fuse(cyl3).cut(cyl4)
crank = doc.addObject("Part::Feature", "Crank")
crank.Shape = shape
crank.Placement.Base = App.Vector(125, -70, 0)
cyl1 = Part.makeCylinder(6, 4)
box1 = Part.makeBox(50, 12, 4, App.Vector(0, -6, 0))
cyl2 = Part.makeCylinder(6, 4, App.Vector(50, 0, 0))
cyl3 = Part.makeCylinder(4, 4)
cyl4 = Part.makeCylinder(4, 4, App.Vector(50, 0, 0))
shape = cyl1.fuse([box1, cyl2]).removeSplitter().cut(cyl3.fuse(cyl4))
connecting_rod = doc.addObject("Part::Feature", "ConnectingRod")
connecting_rod.Shape = shape
connecting_rod.Placement.Base = App.Vector(25, -70, 0)
mat = base.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
base.ViewObject.ShapeAppearance = (mat,)
mat = slider_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
slider_rod.ViewObject.ShapeAppearance = (mat,)
mat = crank.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.70, 0.30, 0.20, 0.0)
crank.ViewObject.ShapeAppearance = (mat,)
mat = connecting_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.0, 0.0)
connecting_rod.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
Con lo strumento Crea Assieme aggiungere un assieme al documento.
Vista ad albero delle parti e dell'assieme
Nella Vista albero trascinare e rilasciare le parti sull'oggetto Assembly. Così possono essere gestiti dal risolutore di Assembly.
Le parti ora sono nel contenitore di Assembly
Per fissare l'assemblaggio nella posizione desiderata, la parte di base deve essere bloccata o fissata a terra, come si dice di seguito. Selezionare la base nella Vista ad albero o nella Vista 3D e utilizzare lo strumento Attiva/disattiva fissaggio. Così si blocca la posizione della base in relazione al sistema di coordinate locale (LCS) del contenitore Assembly. Un oggetto GroundedJoint viene aggiunto al contenitore Joints.
Espandere il contenitore Joints per vedere l'oggetto GroundedJoint
In alternativa ai due passaggi sopra menzionati è anche possibile utilizzare lo strumento Inserisci componente per posizionare gli oggetti all'interno di un assieme. Il primo oggetto diventa automaticamente la parte fissata a terra. Ovvero è necessario iniziare con l'oggetto Base. Lo strumento crea i collegamenti mentre gli oggetti originali rimangono all'esterno dell'assieme. Per evitare confusione è consigliabile renderli invisibili.
Un giunto collega precisamente due elementi di due diverse parti. Facoltativamente possono essere selezionati prima che venga richiamato lo strumento giunto desiderato (qualsiasi numero di elementi selezionati diverso da due comporta una selezione vuota). Gli elementi definiscono la posizione e l'orientamento di un LCS rappresentato da un cerchio pieno sul piano XY locale e tre linee lungo gli assi X (rosso), Y (verde) e Z (blu) locali.
Elementi selezionati + Crea giunto di rotazione → riposizionamento di Crank
Muovere la manovella utilizzando il tasto sinistro del mouse. Dovrebbe essere possibile solo la rotazione attorno al perno.
Elementi selezionati + Crea giunto di scorrimento → perno mobile posizionato
Spostare SliderRod utilizzando il tasto sinistro del mouse. Dovrebbe essere possibile il solo spostamento lungo l'asse.
Elementi selezionati + Crea giunto di rotazione → Biella posizionata
Spostare ConnectingRod usando il tasto sinistro del mouse. Dovrebbe essere possibile solo una rotazione attorno al perno.
Se ci sono più giunti per un asse dobbiamo aiutare il risolutore a trovare la soluzione desiderata.
Se necessario, cliccare e trascinare le parti in una posizione più facile da calcolare.
Elementi selezionati + Crea giunto cilindrico → assemblaggio completato
Una volta completato l'assemblaggio, utilizzare il puntatore del mouse per trascinare le parti in accordo con i giunti utilizzati.
Il perno dello Slider Rod è orientato in modo ridondante. La sua linea centrale è parallela al perno della Base attraverso la catena cinematica dalla Base tramite Manovella e Biella, ovvero il suo asse Z locale non può ruotare attorno a nessun asse X o Y. Il giunto Slider impedisce anche la rotazione del suo asse Z attorno a due assi locali e quindi si traduce in due gradi di libertà ridondantemente vincolati. Un giunto Cilindrico al posto del giunto Slider bloccherebbe solo una rotazione, risultando in un solo grado di libertà vincolato ridondante.
Per controllare il layout dell'assemblaggio tramite l'angolo tra la Base e la Manovella dobbiamo cambiare il giunto Revolute tra di loro in un giunto Fixed. Per farlo, fare doppio clic sull'oggetto Revolute nella vista ad albero. Nella finestra di dialogo cambiare Revolute in Fixed e cambiare il valore Rotation come desiderato (il movimento dovrebbe seguire l'azione della rotellina del mouse).
Notare che una modifica nel tipo di giunto cambierà l'etichetta del giunto, ma non il suo nome. In questo caso l'etichetta viene cambiata in "Fixed".
Per animare l'assieme possiamo cambiare la Rotazione (Offset1.Angle) del giunto Fisso con del codice Python. Basta copiare e incollare le seguenti righe nella console Python:
import math
import FreeCAD as App
import FreeCADGui as Gui
actuator = App.ActiveDocument.getObjectsByLabel("Fixed")[0]
for angle in range(0, 361, 10):
# A full rotation of the Crank in steps of 10°
actuator.Offset1.Rotation.Angle = math.radians(angle)
App.ActiveDocument.recompute()
Gui.updateGui()
Per includere anche questo angolo come risultato valido, la fine dell'intervallo deve essere maggiore di 360.
Questo esempio è temporaneo e potrebbe essere rimosso non appena saranno disponibili descrizioni/tutorial adeguati.
In questo esempio viene creato un giunto universale.
L'assieme è costituito da tre parti solide: due Forcelle identiche e una Croce. Sono necessari anche due elementi non solidi aggiuntivi, Axle1 e Axle2, che rappresentano gli assi angolati. Gli assi e le parti solide sono collegati con diversi giunti.
In questo esempio tutte le parti e l'assieme vengono creati in un unico documento.
Il codice Python qui sotto crea un nuovo documento con quattro oggetti (solo 1 Fork). Basta copiare e incollare le seguenti righe nella console Python:
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
axle1 = doc.addObject("Part::Line", "Axle1")
axle1.X2 = -80
axle1.Y2 = 0
axle1.Z2 = 0
axle2 = doc.addObject("Part::Line", "Axle2")
axle2.X2 = 80
axle2.Y2 = 0
axle2.Z2 = 0
axle2.Placement.Rotation.Angle = math.radians(20)
sph1 = Part.makeSphere(50, App.Vector(0, 0, 0), App.Vector(-1, 0, 0), 0, 90, 360)
box1 = Part.makeBox(50, 40, 80, App.Vector(-50, -20, -40))
cyl1 = Part.makeCylinder(20, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(20, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(30, 60, App.Vector(0, -30, 0), App.Vector(0, 1, 0))
box2 = Part.makeBox(30, 60, 60, App.Vector(0, -30, -30))
cyl4 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl5 = Part.makeCylinder(15, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
shape = sph1.common(box1).fuse([cyl1, cyl2]).cut(cyl3.fuse([box2, cyl4, cyl5]))
fork = doc.addObject("Part::Feature", "Fork")
fork.Shape = shape.removeSplitter()
fork.Placement.Base = App.Vector(0, 100, 0)
cyl1 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(15, 80, App.Vector(0, -40, 0), App.Vector(0, 1, 0))
shape = cyl1.fuse([cyl2])
cross = doc.addObject("Part::Feature", "Cross")
cross.Shape = shape.removeSplitter()
cross.Placement.Base = App.Vector(70, 100, 0)
mat = fork.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
fork.ViewObject.ShapeAppearance = (mat,)
mat = cross.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
cross.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
L'angolo tra gli assi è impostato a 20 gradi. Se si vuole cambiare questo valore selezionare Axle2 e cambiare la proprietà Placement.Angle. Questa proprietà deve essere cambiata prima di spostare Axle2 nell'assieme.
Attenzione: se l'angolo è troppo grande, le parti potrebbero andare in collisione.
Con lo strumento Crea Assieme aggiungere un assieme al documento.
Nella Vista ad albero trascinare e rilasciare gli assi sull'oggetto Assembly.
Selezionare i due assi nella vista ad albero e usare lo strumento Attiva/disattiva fissaggio.
Per gli altri oggetti useremo lo strumento Inserisci componente:
Elementi selezionati + Crea giunto di rotazione + Offset di +40mm or -40mm → riposizionamento di Fork001
Se si richiama prima lo strumento e poi si selezionano gli elementi, è possibile fare clic vicino al punto finale corretto di Axle1 per evitare di dover inserire un offset.
Elementi selezionati + Crea giunto cilindrico → riposizionamento di Cross001
Elementi selezionati + Crea giunto cilindrico → riposizionamento di Fork002
Se richiesto invertire la direzione del giunto utilizzando il pulsante nella barra degli strumenti.
Elementi selezionati + Crea giunto cilindrico → riposizionamento di Cross001 e di Fork002
Il giunto universale può essere movimentato spostando Fork001 con il mouse sinistro.
Se si desidera controllare la configurazione per diversi angoli di rotazione eseguire le seguenti operazioni:
Questo esempio è temporaneo e potrebbe essere rimosso una volta che saranno disponibili descrizioni/tutorial appropriati.
In questo esempio viene creata una morsa.
L'assieme è composto da tre parti solide: una ganascia fissa, una mobile e una vite con la leva. È anche necessario un ulteriore elemento non solido, una manovella. La manovella e le parti solide sono collegate con vari giunti.
Un giunto a vite accoppia la traslazione di una parte con un giunto di scorrimento alla rotazione di una parte con un giunto di rotazione. La parte vite deve fare sia una tralazione che un movimento di rotazione, quindi deve essere una parte con un giunto cilindrico. In questo assieme, la parte vite sarà accoppiata alla ganascia mobile con un giunto parallelo, alla manovella non solida con un giunto di parallelismo, e alla ganascia fissa con un giunto cilindrico.
In questo esempio tutte le parti e l'assieme vengono creati in un unico documento.
Il codice Python qui sotto crea un nuovo documento con quattro oggetti. Basta copiare e incollare le seguenti righe nella console Python:
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
box1 = Part.makeBox(95, 40, 75, App.Vector(0, -20, -22))
cyl1 = Part.makeCylinder(35, 80, App.Vector(0, -40, 53), App.Vector(0, 1, 0), 90)
box2 = Part.makeBox(20, 80, 30, App.Vector(-20, -40, 58))
cyl2 = Part.makeCylinder(15, 80, App.Vector(-15, -40, 58), App.Vector(0, 1, 0), 90)
box3 = Part.makeBox(5, 80, 15, App.Vector(-20, -40, 58))
box4 = Part.makeBox(35, 24, 24, App.Vector(0, -12, -12))
box5 = Part.makeBox(60, 34, 69, App.Vector(35, -17, -19))
cyl3 = Part.makeCylinder(20, 55, App.Vector(-20, -40, 53), App.Vector(1, 0, 0))
cyl4 = Part.makeCylinder(20, 55, App.Vector(-20, 40, 53), App.Vector(1, 0, 0))
cyl5 = Part.makeCylinder(5, 35, App.Vector(0, 0, 38), App.Vector(1, 0, 0))
box6 = Part.makeBox(7, 88, 15, App.Vector(-22, -44, 75))
box7 = Part.makeBox(95, 90, 10, App.Vector(0, -45, -32))
shape = box1.fuse([cyl1, box2, box6, box7]).cut(cyl2.fuse([box3, cyl3, cyl4, cyl5, box4, box5]))
fixedJaw = doc.addObject("Part::Feature", "FixedJaw")
fixedJaw.Shape = shape.removeSplitter()
fixedJaw.Placement.Rotation.Axis = App.Vector(0, 0, 1)
fixedJaw.Placement.Rotation.Angle = math.radians(180)
box1 = Part.makeBox(35, 40, 75, App.Vector(0, -20, -22))
cyl1 = Part.makeCylinder(35, 80, App.Vector(0, -40, 53), App.Vector(0, 1, 0), 90)
box2 = Part.makeBox(20, 80, 30, App.Vector(-20, -40, 58))
cyl2 = Part.makeCylinder(15, 80, App.Vector(-15, -40, 58), App.Vector(0, 1, 0), 90)
box3 = Part.makeBox(160, 24, 24, App.Vector(-160, -12, -12))
box4 = Part.makeBox(5, 80, 15, App.Vector(-20, -40, 58))
box5 = Part.makeBox(160, 18, 18, App.Vector(-160, -9, -9))
cyl3 = Part.makeCylinder(20, 55, App.Vector(-20, -40, 53), App.Vector(1, 0, 0))
cyl4 = Part.makeCylinder(20, 55, App.Vector(-20, 40, 53), App.Vector(1, 0, 0))
cyl5 = Part.makeCylinder(5, 35, App.Vector(0, 0, 38), App.Vector(1, 0, 0))
box6 = Part.makeBox(7, 88, 15, App.Vector(-22, -44, 75))
shape = box1.fuse([cyl1, box2, box3, box6]).cut(cyl2.fuse([box4, cyl3, cyl4, box5, cyl5]))
movableJaw = doc.addObject("Part::Feature", "MovableJaw")
movableJaw.Shape = shape.removeSplitter()
movableJaw.Placement.Base = App.Vector(150, 100, 0)
cyl1 = Part.makeCylinder(5, 190, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cyl2 = Part.makeCylinder(10, 20, App.Vector(190, 0, 0), App.Vector(1, 0, 0))
cyl3 = Part.makeCylinder(4, 100, App.Vector(200, 0, -50), App.Vector(0, 0, 1))
shape = cyl1.fuse([cyl2, cyl3])
leverScrew = doc.addObject("Part::Feature", "LeverScrew")
leverScrew.Shape = shape.removeSplitter()
leverScrew.Placement.Base = App.Vector(150, -100, 0)
wire1 = Part.makePolygon([App.Vector(0, 0, 100), App.Vector(0, 0, 0), App.Vector(100, 0, 0)])
crank = doc.addObject("Part::Feature", "Crank")
crank.Shape = wire1
crank.Placement.Base = App.Vector(0, -100, 0)
mat = fixedJaw.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
fixedJaw.ViewObject.ShapeAppearance = (mat,)
mat = movableJaw.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
movableJaw.ViewObject.ShapeAppearance = (mat,)
mat = leverScrew.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.70, 0.30, 0.20, 0.0)
leverScrew.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
Con lo strumento Crea Assieme aggiungere un assieme al documento.
Nella Vista albero trascinare e rilasciare le parti sull'oggetto Assembly. Così possono essere gestiti dal risolutore di Assembly.
Per mantenere l'assemblaggio nella posizione desiderata, la parte FixedJaw deve essere bloccata, o messa a terra come viene chiamata qui. Selezionare il FixedJaw nella Vista ad albero o nella Vista 3D] ed utilizzare lo strumento [[Assembly_ToggleGrounded/it|Attiva/disattiva fissaggio]. Un oggetto GroundedJoint viene aggiunto al contenitore dei Joints.
Elementi selezionati + Crea giunto di rotazione → manovella posizionata
Elementi selezionati + Crea giunto di scorrimento → riposizionamento di MovableJaw
Impostare la lunghezza minima a -77 mm e la lunghezza massima a -7 mm. Così si limita l'apertura della morsa a 70 mm.
I successivi tre giunti sono necessari per forzare il LeverScrew a: traslare come il MovableJaw, ruotare come il Crank, e ruotare intorno all'asse principale.
Elementi selezionati + Crea giunto di distanziamento → riposizionamento di LeverScrew
Seleziona due facce. Impostare il valore di distanza a 20 mm.
Elementi selezionati + Crea vincolo di parallelismo → riposizionamento di LeverScrew
Elementi selezionati + Crea un giunto cilindrico → riposizionamento di LeverScrew
Elementi selezionati (LeverScrew invisible) + Create un vincolo di Vite → meccanismo completo della morsa (LeverScrew è visibile)
Se necessario rendere invisibile LeverScrew durante la selezione.
Impostare il raggio Pitch a 5 mm
La morsa può essere movimentata spostando Crank o MovableJaw con il mouse sinistro.
Questo esempio è temporaneo e potrebbe essere rimosso una volta che saranno disponibili descrizioni/tutorial appropriati.
In questo esempio viene creato un ammortizzatore.
L'assemblaggio è composto da tre parti solide: un pistone, un cilindro e una molla. Sono necessari altri tre elementi non solidi, due assi e un'asta. Tutte le parti sono collegate con i relativi giunti.
La cerniera del pistone ruota intorno a Axle2, mentre la cerniera del cilindro si muove su un arco di cerchio incentrato su Axle1. Il Rod non solido è usato per questo movimento. La lunghezza del Rod è il raggio dell'arco.
Il codice Python qui sotto creerà un nuovo documento con 6 oggetti. Creare una nuova macro e copiare il codice sottostante nell'editor Python (non nella console Python). Quindi [Std_DlgMacroExecuteDirect/it|eseguire la macro].
Il codice sottostante non può essere eseguito dalla console Python perché la molla deve essere un oggetto Part:::FeaturePython definito da una classe con le funzioni di callback execute()
e onChanged()
. Solo allora la sua altezza può essere cambiata tramite la corrispondente proprietà.
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
class Spring():
def __init__(self, spring):
spring.addProperty("App::PropertyLength", "Height", "Spring", "Height of the helix").Height = 200.0
spring.Proxy = self
spring.ViewObject.Proxy = 0
def execute(self, spring):
helix = Part.makeHelix(spring.Height/8.5, spring.Height, 35)
startPnt = helix.Edges[0].Curve.value(0)
section = Part.Wire([Part.Circle(startPnt, App.Vector(0, 1, 0), 5).toShape()])
hel1 = helix.makePipeShell([section], True, True)
box1 = Part.makeBox(80, 80, 10, App.Vector(-40, -40, -10))
box2 = Part.makeBox(80, 80, 10, App.Vector(-40, -40, spring.Height))
shape = hel1.cut(box1).cut(box2)
spring.Shape = shape
def onChanged(self, spring, prop):
if prop == "Height":
self.execute(spring)
spring = doc.addObject("Part::FeaturePython", "Spring")
Spring(spring)
spring.Placement.Base = App.Vector(0, 100, 0)
axle1 = doc.addObject("Part::Line", "Axle1")
axle1.X2 = 0
axle1.Y2 = 80
axle1.Z2 = 0
axle2 = doc.addObject("Part::Line", "Axle2")
axle2.X2 = 0
axle2.Y2 = 80
axle2.Z2 = 0
axle2.Placement.Base = App.Vector(120, 0, -250)
rod = doc.addObject("Part::Line", "Rod")
rod.X2 = 100
rod.Y2 = 0
rod.Z2 = 0
rod.Placement.Base = App.Vector(0, -50, 0)
cyl1 = Part.makeCylinder(40, 10,App.Vector(0, 0, -5))
tor1 = Part.makeTorus(40, 5)
cyl2 = Part.makeCylinder(45, 5)
box1 = Part.makeBox(30, 10, 30,App.Vector(-15, -5, -35))
cyl3 = Part.makeCylinder(15, 10, App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl4 = Part.makeCylinder(40, 5)
cyl5 = Part.makeCylinder(5, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl6 = Part.makeCylinder(5, 130)
cyl7 = Part.makeCylinder(20, 5,App.Vector(0, 0, 130))
shape = cyl1.fuse([tor1,cyl2, box1, cyl3]).cut(cyl4.fuse([cyl5])).fuse([cyl6, cyl7])
piston = doc.addObject("Part::Feature", "Piston")
piston.Shape = shape.removeSplitter()
piston.Placement.Base = App.Vector(200, 100, -200)
cyl1 = Part.makeCylinder(40, 10,App.Vector(0, 0, -5))
tor1 = Part.makeTorus(40, 5)
cyl2 = Part.makeCylinder(45, 5)
box1 = Part.makeBox(30, 10, 30,App.Vector(-15, -5, -35))
cyl3 = Part.makeCylinder(15, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl4 = Part.makeCylinder(40, 5)
cyl5 = Part.makeCylinder(5, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl6 = Part.makeCylinder(25, 130)
tor2 = Part.makeTorus(20, 5,App.Vector(0, 0, 130))
cyl7 = Part.makeCylinder(20, 135)
cyl8 = Part.makeCylinder(20, 130)
cyl9 = Part.makeCylinder(5, 135)
shape = cyl1.fuse([tor1, cyl2, box1, cyl3]).cut(cyl4.fuse([cyl5])).fuse([cyl6, tor2, cyl7]).cut(cyl8.fuse([cyl9]))
cylinder = doc.addObject("Part::Feature", "Cylinder")
cylinder.Shape = shape.removeSplitter()
cylinder.Placement.Rotation.Axis = App.Vector(0, 1, 0)
cylinder.Placement.Rotation.Angle = math.pi
cylinder.Placement.Base = App.Vector(100, 100, 0)
mat = piston.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
piston.ViewObject.ShapeAppearance = (mat,)
mat = cylinder.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
cylinder.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
Con lo strumento Crea Assieme aggiungere un assieme al documento.
Nella Vista albero trascinare e rilasciare le parti sull'oggetto Assembly. Così possono essere gestiti dal risolutore di Assembly.
Per mantenere l'assieme nella posizione desiderata, i due assi devono essere bloccati, o a terra come viene detto qui. Selezionare i due assi nella [[[Tree_view/it|Vista ad albero]]] o nella Vista 3D] ed utilizzare lo strumento [[Assembly_ToggleGrounded/it|Attiva/disattiva fissaggio]. I due oggetti GroundedJoint vengono aggiunti al contenitore Joints.
Crea giunto di rotazione + Elementi selezionati → riposizionamento di Piston
Crea giunto di scorrimento + Elementi selezionati → riposizionamento e spostamento di Cylinder
Si presti attenzione alla posizione del sistema di coordinate prima di selezionare una faccia. Dovrebbe essere al centro di ognuna delle facce.
Trascinare il cilindro per creare una distanza tra questo e il pistone. Le facce di sostegno per la Spring dovrebbero essere visibili.
Crea Giunto di distanziamento + Facce selezionate → riposizionamento di Cylinder Distance a 200 mm
Impostare il valore di distanza a 200 mm.
I due vincoli successivi sono necessari per forzare la cerniera del cilindro a muoversi su un arco di cerchio.
Crea giunto cilindrico + Elementi selezionati → riposizionamento di Rod
Assicurarsi che l'asse Z del sistema di coordinate (blu) sia perpendicolare a Rod selezionando un punto finale.
Crea giunto di rotazione + Elementi selezionati → riposizionamento di Cylinder
Ancora una volta assicurarsi che l'asse Z del sistema di coordinate (blu) sia perpendicolare a Rod.
Si possono incontrare problemi con questo giunto. Se fosse questo il caso provare la seguente procedura:
I seguenti due giunti servono a fissare Spring alla faccia di supporto.
Crea vincolo di parallelismo + Facce selezionate → riposizionamento di Spring
Selezionare il centro della faccia di supporto su Piston e il centro della faccia inferiore della molla. Tenere il valore di distanza pari a 0.
Crea un giunto fisso + Elementi selezionati → riposizionamento di Spring
Selezionare il vertice inferiore della giunzione del cilindro nel pistone e il vertice dell'angolo di Spring.
<<Distance>>.Distance
Per farlo fare doppio clic sull'oggetto Distance nella vista ad Albero e cambiare la sua proprietà Distance. Ricalcolare il documento. La Spring cambierà la sua lunghezza.